"""
作者：Monte（Perma）
邮箱：644527030@qq.com
"""
import pymysql

class Mysql:

    # 数据表名
    table = ""
    # 查询条件
    whereData = {}
    # 初始化条件查询列表
    whereList = []
    # 条件and组合
    whereDataStr = ""
    # 打印sql语句
    getLastSql = ""

    def __init__(self, table = None):
        # 连接数据库
        self.db = pymysql.connect(host="localhost", port=8889, user="root", passwd="root", db="mpyblog", charset='utf8')
        # 使用 cursor() 方法创建一个游标对象 cursor
        self.cursor = self.db.cursor()
        # 数据表
        self.table = table

    # 创建数据表
    def create(self, sql):
        # 使用 execute() 方法执行 SQL，如果表存在则删除
        self.cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
        
        # 使用预处理sql语句创建表    
        return self.cursor.execute(sql)

    # 查(多条)
    def select(self):

        try:
            # 执行SQL语句
            self.cursor.execute(self.set_sql("select"))
            # 获取所有记录列表
            results = self.cursor.fetchall()
            return results
        except:
            return "Error: 无法提取数据"
    
    # 查(单条)
    def find(self):
        try:
            # 执行SQL语句
            self.cursor.execute(self.set_sql("find"))
            # 获取所有记录列表
            results = self.cursor.fetchone()
            return results
        except:
            return "Error: 无法提取数据"
    
    # 增
    def insert(self, sql):
        try:
            # 执行sql语句
            self.cursor.execute(sql)
            # 提交到数据库执行
            return self.db.commit()
        except:
            # 如果发生错误则回滚
            self.db.rollback()

    # 改
    def update(self, sql):
        try:
            # 执行SQL语句
            self.cursor.execute(sql)
            # 提交到数据库执行
            return self.db.commit()
        except:
            # 发生错误时回滚
            self.db.rollback()

    # 删
    def delete(self):
        try:
            # 执行SQL语句
            self.cursor.execute(self.set_sql("delete"))
            # 提交修改
            return self.db.commit()
        except:
            # 发生错误时回滚
            self.db.rollback()

    # 查询条件
    def where(self, whereData = None):
        if whereData == None:
            self.whereDataStr = 1
            return self
        # 构造where条件
        # 解析{}字典生成查询条件
        for key, value in whereData.items():
            self.whereList.append(key+'="'+value+'"')
        # 组合查询条件
        self.whereDataStr = " AND ".join(self.whereList)
        return self

    # sql语句组合器
    def set_sql(self, query_type):
        # 模拟switch
        switch = {
            # 数据查询（多条）
            "select":
                "SELECT * FROM `"+self.table+"` WHERE "+self.whereDataStr,
            # 数据查询（单条）
            "find":
                "SELECT * FROM `"+self.table+"` WHERE "+self.whereDataStr+" LIMIT 1",
            # 数据添加
            "insert":
                "",
            # 数据修改
            "update":
                "",
            # 数据删除
            "delete":
                "DELETE FROM `"+self.table+"` WHERE "+self.whereDataStr,
        }
        try:
            sql = switch[query_type]
            # 写入生成后的sql语句到属性
            # self.getLastSql = sql
            return sql
        except KeyError as e:
            return e

    # 原生sql语句查询构造器
    def query(self, sql, all = True):
        # 去除字符串两边的空格
        sql = sql.strip()
        # 截取sql语句的关键字
        sql_wh = sql[0:6].strip().upper()

        if sql_wh == "SELECT":
            # 执行查询
            try:
                # 执行sql语句
                self.cursor.execute(sql)
                # 执行sql语句
                if all == True:
                    # 全部
                    results = self.cursor.fetchall()
                else:
                    # 单条
                    results = self.cursor.fetchone()
            except:
                # 发生错误时回滚
                self.db.rollback()
        else:
            # 执行增、改、删
            try:
                # 执行SQL语句
                results = self.cursor.execute(sql)
                # 提交修改
                self.db.commit()
            except:
                # 发生错误时回滚
                self.db.rollback()
        return results

    def __del__(self):
        # 关闭数据库连接
        self.db.close()
        # print("关闭数据库链接")
 
